home *** CD-ROM | disk | FTP | other *** search
/ Ahoy 1985 June / Ahoy_Magazine_85-06_1985_Double_L.d64 / 6510 simulator (.txt) < prev    next >
Commodore BASIC  |  2022-10-26  |  11KB  |  322 lines

  1. 100 rem ******* 6510 simulator ********
  2. 110 data asl,brk,clc,cld,cli,clv,dex,dey,inx,iny,lsr,nop,pha,php,pla
  3. 120 data plp,rol,ror,rti,rts,sec,sed,sei,tax,tay,tsx,txa,txs,tya
  4. 130 data adc,and,cmp,cpx,cpy,eor,lda,ldx,ldy,ora,sbc
  5. 140 data adc,and,asl,bcc,bcs,beq,bit,bmi,bne,bpl,bvc,bvs,cmp,cpx,cpy
  6. 150 data dec,eor,inc,jmp,jsr,lda,ldx,ldy,lsr,ora,rol,ror,sbc,sta,stx
  7. 160 data sty,asl,lsr,rol,ror
  8. 170 data 0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f
  9. 180 data 0000,0001,0010,0011,0100,0101,0110,0111
  10. 190 data 1000,1001,1010,1011,1100,1101,1110,1111
  11. 200 dim hex$(8),bit$(8),h$(16),b$(16),temp$(2),bit(8),n$(75)
  12. 210 ah$="00":xh$="00":yh$="00":z$="0":ad=0:sc=0:yd=0
  13. 220 ab$="00000000":xb$="00000000":yb$="00000000"
  14. 230 n=0:v=0:b=0:d=0:i=0:z=0:c=0
  15. 240 if right$(a$,1)=" "then 300:rem type a space between the quotes
  16. 250 for l=1 to 75:read n$(l):next l
  17. 260 for l=1 to 16:read h$(l):next l:for l=1 to 16:read b$(l):next l
  18. 270 print "[147]":poke53280,0:poke53281,6:poke646,1
  19. 280 print " n  v  -  b  d  i  z  c"
  20. 285 print n;v;" - ";b;d;i;z;c:print
  21. 290 print "a: ";ah$;"       x: ";xh$;"       y: ";yh$
  22. 295 print ab$;"    ";xb$;"    ";yb$:print
  23. 300 b=0:a$="":input " ";a$:rem type space between second pair of quotes
  24. 320 if len(a$)<3 or len(a$)>10 then 300
  25. 330 if len(a$)=3 then 420:rem go to implied-address routines
  26. 340 if mid$(a$,4,1)<>chr$(32) then 300
  27. 350 if right$(a$,1)=chr$(32) then 300
  28. 360 goto 450:rem go to immediate- and absolute-address routines
  29. 370 rem *** routine to convert op$ & ad$ to binary numbers ***
  30. 380 od$=op$:gosub 1130:for l=1 to 8:bit$(l)=z$:next l
  31. 390 for l=1 to 8:b1$(l)=mid$(ob$,l,1):next l
  32. 400 for l=1 to 8:b2$(l)=mid$(ab$,l,1):next l:return
  33. 410 rem *** implied-addressing routines ***
  34. 420 for l=1 to 29:if a$=n$(l) then oc$=a$:oc=l:goto  1350
  35. 430 next l:goto 300
  36. 440 rem *** immediate, absolute & accumulator address modes ***
  37. 450 oc$=left$(a$,3):op$=mid$(a$,5)
  38. 460 if left$(op$,1)="#" and mid$(op$,2,1)="$" then  flag$="ah":goto  530
  39. 470 if left$(op$,1)="#" then flag$="ad":goto 620
  40. 480 if left$(op$,1)="$" then flag$="ih":goto 690
  41. 490 if op$="a" then 790
  42. 500 if left$(op$,1)<"0" and left$(op$,1)>"9" then 300:rem try again
  43. 510 flag$="id":goto 840
  44. 520 rem *** hex operand, absolute address ***
  45. 530 op$=mid$(op$,3)
  46. 540 for l=30 to 40:if oc$=n$(l) then oc=l:goto 560
  47. 550 next l:goto 300
  48. 560 if  len(op$)>2 then 300
  49. 570 for l=1 to  len(op$):x$=mid$(op$,l,1):if x$<z$ or x$>"f" then 300
  50. 580 if x$>"9"and x$<"a" then 300
  51. 590 if len(op$)=1 then op$=z$+op$
  52. 600 oh$=op$:gosub 1030:op$=od$:goto 670
  53. 610 rem *** decimal operand, absolute addressing ***
  54. 620 op$=mid$(op$,2)
  55. 630 for l=30to 40:if oc$=n$(l) then oc=l:goto 650
  56. 640 next l:goto 300
  57. 650 if val(op$)>255 then 300
  58. 660 for  l=1 to len(op$):x$=mid$(op$,l,1):ifasc(x$)<48 or asc(x$)>57 then 420
  59. 670 oc=oc-29:goto 1420
  60. 680 rem *** hex operand, immediate address ***
  61. 690 op$=mid$(op$,2)
  62. 700 for  l=41 to 71:if oc$=n$(l) then oc=l:goto720
  63. 710 next l:goto 300
  64. 720 if len(op$)>4  then 300
  65. 730 for l=1 to len(op$):x$=mid$(op$,l,1):if x$<z$ or x$>"f" then 300
  66. 740 if x$>"9" and x$<"a" then 300
  67. 750 next l
  68. 760 oh$=op$:gosub 1030:op$=od$:op$=str$(peek(val(op$)))
  69. 770 oc=oc-40:goto 1430
  70. 780 rem *** accumulator addressing ***
  71. 790 op$="a"
  72. 800 for l=72 to75:if oc$=n$(l) then oc=l-71: goto 820
  73. 810 next l:goto 300
  74. 820 on oc goto 1510,1760,1790,1810
  75. 830 rem *** decimal operand, immediate address **
  76. 840 if val(op$)>65535 then 300
  77. 860 for l=1 to len(op$):x$=mid$(op$,l,1):if asc(x$)<48 or asc(x$)>57 then 300
  78. 870 for l=41 to 71:if oc$=n$(l) then oc=l:goto 890
  79. 880 next l:goto 300
  80. 890 op$=str$(peek(val(op$)))
  81. 900 oc=oc-40:goto 1430
  82. 910 rem *** decimal-to-hexadecimal conversion ***
  83. 920 for l=1 to 4:hex$(l)="":next l
  84. 930 for l=1 to 5:t$=right$(od$,l):next l
  85. 940 nr=val(od$):x=4
  86. 950 tmp=nr:nr=int(nr/16):tmp=tmp-nr*16
  87. 960 if tmp<10 then hex$(x)=right$(str$(tmp),1):goto 980
  88. 970 hex$(x)=chr$(tmp-10+asc("a"))
  89. 980 if nr<>0 then x=x-1:goto 950
  90. 990 oh$=hex$(1)+hex$(2)+hex$(3)+hex$(4)
  91. 1000 if len(oh$)=1 then oh$=z$+oh$
  92. 1010 return
  93. 1020 rem *** hexadecimal-to-decimal conversion ***
  94. 1030 nr=0:for l=1 to len(oh$):hex$(l)=mid$(oh$,l,1)
  95. 1040 if hex$(l)<="9" then nr=nr*16+val(hex$(l)):goto 1060
  96. 1050 nr=nr*16+asc(hex$(l))-asc("a")+10
  97. 1060 next l:od$=str$(nr):return
  98. 1070 rem *** binary-to-decimal conversion ***
  99. 1080 for l=8 to 1 step -1:b$(l)=mid$(ob$,l,1):next l
  100. 1090 for l=1 to 8:bit(l)=val(b$(l)):next l:od=0:nr=256
  101. 1100 for  l=1 to8:nr=nr/2:od=od+bit(l)*nr:next l
  102. 1110 od$=str$(od):return
  103. 1120 rem *** decimal-to-binary conversion ***
  104. 1130 od=val(op$):for l=8 to 1 step -1:tmp=od/2:nr=tmp-int(tmp)
  105. 1140 if nr=0 then bt$(l)=z$:goto 1160
  106. 1150 bt$(l)="1"
  107. 1160 od=int(tmp):next l
  108. 1170 ob$=bt$(1)+bt$(2)+bt$(3)+bt$(4)+bt$(5)+bt$(6)+bt$(7)+bt$(8):return
  109. 1180 rem *** hex-to-binary conversion ***
  110. 1190 hex$(1)="":hex$(2)="":for l=1 tolen (oh$):hex$(l)=mid$(oh$,l,1)
  111. 1200 next l:if hex$(2)="" then hex$(2)=hex$(1):hex$(1)=z$
  112. 1210 for l=1 to 16:if hex$(1)=h$(l) then bit$(1)=b$(l)
  113. 1220 next l:for l=1 to 16:if hex$(2)=h$(l) then bit$(2)=b$(l)
  114. 1240 next l:ob$=bit$(1)+bit$(2):print:return
  115. 1260 rem *** binary-to-hex conversion ***
  116. 1270 for l=1 to 8:bit$(l)=mid$(ob$,l,1):next l
  117. 1280 bit$=bit$(1)+bit$(2)+bit$(3)+bit$(4)+bit$(5)+bit$(6)+bit$(7)+bit$(8)
  118. 1290 t1$=left$(bit$,4):t2$=right$(bit$,4):for l=1 to 16
  119. 1300 if t1$=b$(l)then hex$(1)=h$(l)
  120. 1310 next l:for l=1 to 16:if t2$=b$(l) then hex$(2)=h$(l)
  121. 1320 next l:if hex$(1)="" then hex$(1)=z$
  122. 1330 oh$=hex$(1)+hex$(2):return
  123. 1340 rem *** on/goto data ***
  124. 1350 on oc goto 1510,1560,1570,1580,1590,1600,1610,1650,1690,1730
  125. 1360 nr=oc-10:on nr goto 1760,1780,1780,1780,1780,1780,1790,1810,1830,1840
  126. 1380 nr=nr-10:on nr goto 1850,1860,1870,1880,1900,1920,1930,1940,1950,1840
  127. 1400 nr=nr-10:on nr goto 1850,1860,1870,1880,1900,1920,1930,1940,1950,1950
  128. 1420 on oc goto 1970,2100,2170,2250,2320,2390,2450,2550,2650,2750,2810
  129. 1430 on oc goto 1970,2350,3250,1780,1780,1780,3200,1780,1780,1780
  130. 1440 nr=oc-10:on nr goto 1780,1780,3250,2250,2320,3260,2390,3290,1780,1780
  131. 1460 nr=nr-10:on nr goto 2450,2550,2650,3320,2750,3340,3360,2810,1780,1780
  132. 1480 nr=nr-10:on nr goto 1780,3390
  133. 1500 rem *** implied-address op-code routines
  134. 1510 c=val(left$(ab$,1)):ab$=mid$(ab$,2)+z$:rem *** asl ***
  135. 1520 ob$=ab$:gosub 1270:ah$=oh$:op$=oh$:gosub 1030:n=0:z=0
  136. 1530 if left$(ob$,1)="1"then n=1
  137. 1540 if val(od$)=0then z=1
  138. 1550 goto 3390
  139. 1560 b=1:goto 3390:rem *** brk ***
  140. 1570 c=0:goto 3390:rem *** clc ***
  141. 1580 d=0:goto 3390:rem *** cld ***
  142. 1590 i=0:goto 3390:rem *** cli ***
  143. 1600 v=0:goto 3390:rem *** clv ***
  144. 1610 oh$=xh$:gosub 1030:xd=val(od$):rem *** dex **
  145. 1620 xd=xd-1:if xd<0 then xd=255
  146. 1630 od$=str$(xd):gosub920:xh$=oh$:gosub 1190:xb$=ob$
  147. 1640 tmp=xd:gosub 3410:goto 280
  148. 1650 oh$=yh$:gosub 1030:yd=val(od$):rem *** dey ***
  149. 1660 yd=yd-1:if yd<0 then yd=255
  150. 1670 od$=str$(yd):gosub 920:yh$=oh$:gosub 1190:yb$=ob$
  151. 1680 tmp=yd:gosub 3410:goto 280
  152. 1690 oh$=xh$:gosub 1030:xd=val(od$):rem *** inx ***
  153. 1700 od$=str$(xd):gosub 920:xh$=oh$:gosub 1190:xb$=ob$
  154. 1710 xd=xd+1:if xd>255 then xd=0
  155. 1720 goto 1630
  156. 1730 oh$=yh$:gosub 1030:yd=val(od$):rem *** iny ***
  157. 1740 yd=yd+1:if yd>255 then yd=0
  158. 1750 goto 1670
  159. 1760 c=val(right$(ab$,1)):ab$=z$+left$(ab$,7):rem *** lsr ***
  160. 1770 goto 1520
  161. 1780 goto 3390:rem *** nop,pha,php,pla and plp ***
  162. 1790 goto 3340:rem *** rol ***
  163. 1810 goto 3360:rem *** ror ***
  164. 1830 n=0:v=0:b=0:d=0:i=0:z=0:c=0:goto 280 rem *** rti ***
  165. 1840 (NULL)t 3390:rem *** rts ***
  166. 1850 c=1:goto 3390:rem *** sec ***
  167. 1860 d=1:goto 3390;rem *** sed ***
  168. 1870 i=1:goto 3390:rem *** sei ***
  169. 1880 xh$=ah$:xb$=ab$:op$=ah$:gosub 1030:tmp=val(od$):rem *** tax ***
  170. 1890 gosub 3410:goto 3390
  171. 1900 yh$=ah$:yb$=ab$:op$=ah$:gosub 1030:tmp=val(od$):rem *** tay ***
  172. 1910 gosub 3410:goto 3390
  173. 1920 xh$="00":xb$="00000000":gosub 3410:goto 3390:rem *** tsx ***
  174. 1930 ah$=xh$:ab$=xb$:goto 1520:rem *** txa ***
  175. 1940 goto 3390:rem *** txs ***
  176. 1950 ah$=yh$:ab$=yb$:goto 1520:rem *** tya ***
  177. 1960 rem *** absolute-address operands ***
  178. 1970 if d then 2950:rem *** adc ***
  179. 1980 op=val(op$):tmp$=ab$
  180. 1990 gosub 1130:plus$=ob$
  181. 2000 oh$=ah$:gosub 1030:ad$=od$:ad=val(ad$):tmp=ad
  182. 2010 ad=ad+op+c:c=0:if ad>255 then gosub 2090
  183. 2020 ad$=str$(ad):od$=ad$:gosub920:ah$=oh$
  184. 2030 gosub 1190:ab$=ob$
  185. 2040 n=0:if ad>127 then n=1
  186. 2050 z=0:if ad=0 then z=1
  187. 2060 v=0
  188. 2070 if left$(tmp$,1)=left$(plus$,1) and left$(tmp$,1)<>left$(ab$,1)then v=1
  189. 2080 od$=ad$:gosub 1030:ah$=oh$:goto 280
  190. 2090 c=1:ad=ad-256:return
  191. 2100 gosub 380:rem *** and ***
  192. 2110 for l=1 to 8:bit$(l)="0":next l
  193. 2120 for l=1 to 8:if b1$(l)="1" and b2$(l)="1" then bit$(l)="1"
  194. 2130 next l
  195. 2140 ab$=bit$(1)+bit$(2)+bit$(3)+bit$(4)+bit$(5)+bit$(6)+bit$(7)+bit$(8)
  196. 2150 ob$=ab$:gosub 1270:ah$=oh$
  197. 2160 gosub 1030:tmp=val(od$):gosub3410:print:goto 280
  198. 2170 oh$=ah$:gosub 1030:ad$=od$:ad=val(ad$):op=val(op$):rem *** cmp ***
  199. 2180 z=0:if ad=op then z=1
  200. 2190 n=0:if op>ad then n=1
  201. 2220 c=0:if  ad>op or ad=op then c=1
  202. 2240 goto 3390
  203. 2250 oh$=xh$:gosub 1030:xd$=od$:xd=val(xd$):op=val(op$):rem *** cpx ***
  204. 2260 z=0:if xd=op then z=1
  205. 2280 n=0:if op>xd then n=1
  206. 2300 c=0:if xd>op or xd=op then c=1
  207. 2310 goto 3380
  208. 2320 oh$=yh$:gosub 1030:yd$=od$:yd=val(yd$):op=val(op$):rem *** cpy ***
  209. 2330 z=0:if yd=op then z=1
  210. 2340 n=0:if op>yd then n=1
  211. 2350 c=0:if yd>op or yd=op then c=1
  212. 2380 goto 3380
  213. 2390 gosub 380:rem *** eor ***
  214. 2400 for l=1 to 8:bit$(l)=z$:next l
  215. 2410 for l=1 to 8:if b1$(l)="1" and b2$(l)="1" then bit$(l)="0":goto 2440
  216. 2420 if b1$(l)="1" or b2$(l)="1" then bit$(l)="1"
  217. 2440 next l:goto 2140
  218. 2450 if d=1 then 2480:rem *** lda ***
  219. 2460 od$=op$:gosub 920:ah$=oh$:gosub 1190:ab$=ob$
  220. 2470 tmp=val(op$):gosub 3410:goto 280
  221. 2480 if flag$="ad" and val(op$)>99 then 300
  222. 2490 if flag$<>"ad" then od$=op$:gosub 920:ah$=oh$:goto 2530
  223. 2500 if len(op$)=1 then op$=z$+op$
  224. 2510 ah$=op$:oh$=ah$:goto 2530
  225. 2520 od$=op$:gosub 920:ah$=oh$
  226. 2530 gosub 1190:ab$=ob$
  227. 2540 tmp=val(op$):gosub 3410:goto 2470
  228. 2550 if d=1 then 2580:rem *** ldx ***
  229. 2560 od$=op$:gosub 920:xh$=oh$:gosub 1190:xb$=ob$
  230. 2570 tmp=val(op$):gosub 3410:goto 280
  231. 2580 if flag$="ad" and val(op$)>99 then 300
  232. 2590 if flag$<>"ad" then od$=op$:gosub 920:xh$=oh$:goto 2630
  233. 2600 if len(op$)=1 then op$=z$+op$
  234. 2610 xh$=op$:oh$=xh$:goto 2630
  235. 2620 od$=op$:gosub 920:xh$=oh$
  236. 2630 gosub 1190:xb$=ob$
  237. 2640 tmp=val(op$):gosub 3410:goto 2570
  238. 2650 if d=1 then 2680:rem *** ldx ***
  239. 2660 od$=op$:gosub 920:yh$=oh$:gosub 1190:yb$=ob$
  240. 2670 tmp=val(op$):gosub 3410:goto 280
  241. 2680 if flag$="ad" and val(op$)>99 then 300
  242. 2690 if flag$<>"ad" then od$=op$:gosub 920:yh$=oh$:goto 2730
  243. 2700 if len(op$)=1 then op$=z$+op$
  244. 2710 yh$=op$:oh$=yh$:goto 2730
  245. 2720 od$=op$:gosub 920:xh$=oh$
  246. 2730 gosub 1190:yb$=ob$
  247. 2740 tmp=val(op$):gosub 3410:goto 2670
  248. 2750 gosub 380:rem *** ora ***
  249. 2760 for l=1 to8:if b1$(l)="1" or b2$(l)="1" then bit$(l)="1"
  250. 2770 next l:ab$="":for l=1 to 8:ab$=ab$+bit$(l):next l
  251. 2790 ob$=ab$:gosub 1270:ah$=oh$
  252. 2800 gosub 1030:tmp=val(od$):gosub3410:goto 3390
  253. 2810 if d then 3060:rem *** sbc ***
  254. 2820 op=val(op$):tmp$=ab$
  255. 2830 gosub 1130:mi$=ob$
  256. 2840 oh$=ah$:gosub 1030:ad$=od$:ad=val(ad$):tmp=ad
  257. 2850 ad=ad-op:if c=0 then ad=ad-1
  258. 2860 if ad<0 then ad=256+ad:c=0
  259. 2870 ad$=str$(ad):od$=ad$:gosub 920:ah$=oh$
  260. 2880 gosub 1190:ab$=ob$
  261. 2890 n=0:if ad>127 then n=1
  262. 2900 z=0:if ad=0 then z=1
  263. 2910 v=0:if left$(tmp$,1)=left$(mi$,1) then 2930
  264. 2920 if left$(ab$,1)=left$(tmp$,1) then v=1
  265. 2930 od$=ad$:gosub 1030:ah$=oh$:goto 280
  266. 2940 rem *** bcd addition routine ***
  267. 2950 if flag$<>"ad" then 1980
  268. 2960 if left$(ah$,1)>"9" or right$(ah$,1)>"9" then 3030
  269. 2970 ad=val(ah$)
  270. 2980 op=val(op$):ad=ad+op+c:c=0
  271. 2990 gosub 1030:tmp=val(od$):gosub 3410
  272. 3000 if ad>99 then gosub 3040
  273. 3010 ah$=str$(ad):if len(ah$)=1 then ah$=z$+ah$
  274. 3020 oh$=ah$:gosub 1190:ab$=ob$:goto 280
  275. 3030 oh$=ah$:gosub 1030:ad$=od$:ad=val(ad$):goto 2980
  276. 3040 c=1:ad=ad-100:return
  277. 3050 rem *** bcd subtraction routine ***
  278. 3060 if flag$<>"ad" then 2820
  279. 3070 if left$(ah$,1)>"9" or right$(ah$,1)>"9" then 3120
  280. 3080 ad=val(ah$):op=val(op$):ad=ad-op:if c=0 then ad=ad-1
  281. 3100 if ad<0 then gosub 3130
  282. 3110 goto 3010
  283. 3120 oh$=ah$:gosub 1030:ad$=od$:ad=val(ad$):goto 3090
  284. 3130 c=0:ad=100+ad:return
  285. 3140 rem *** immediate-address routines ***
  286. 3150 od$=op$:gosub 920:gosub 1190:rem *** asl ***
  287. 3160 c=val(left$(ob$,1)):ob$=mid$(ob$,2)+z$
  288. 3170 gosub 1270:gosub 1030:x=val(od$):n=0:if x<0 then n=1
  289. 3180 z=0:if x=0 then z=1
  290. 3190 goto 280
  291. 3200 gosub 1030:ad=val(od$):rem *** bit ***
  292. 3210 gosub 1130:n=val(left$(ob$,1)):v=val(mid$(ob$,2,1))
  293. 3220 gosub 400:z=1:for l=1 to 8
  294. 3230 if b1$(l)="1" and b2$="1" then z=0
  295. 3240 next l:goto 3390
  296. 3250 goto 2170
  297. 3260 op=val(op$):op=op-1:if op<0 then n:rem *** dec ***
  298. 3270 if op=0 then z=1
  299. 3280 goto 3390
  300. 3290 op=val(op$):op=op+1:if op<0 then n=1:rem *** inc ***
  301. 3300 if op=z then z=1
  302. 3310 goto 3390
  303. 3320 od$=op$:gosub 920:gosub 1190
  304. 3330 c=val(right$(ob$,1)):ob$=z$+left$(ob$,7):goto 3170
  305. 3340 if c=1 then j$="1":rem *** rol ***
  306. 3341 if c=0 then j$="0"
  307. 3342 c=val(left$(ab$,1)):ab$=right$(ab$,7)+j$
  308. 3350 ob$=ab$:gosub 1270:ah$=oh$:op$=oh$:gosub 1030:n=0:z=0
  309. 3355 if left$(ob$,1)="1" then n=1
  310. 3356 if val(od$)=0then z=1
  311. 3357 goto 3390
  312. 3360 if c=1 then j$="1":rem *** ror ***
  313. 3365 if c=0 then j$=z$
  314. 3370 c=val(right$(ab$,1)):ab$=j$+left$(ab$,7)
  315. 3371 goto 3350
  316. 3380 rem *** print line space & get another line ***
  317. 3390 print:goto 280
  318. 3400 rem *** set z and n flags ***
  319. 3410 n=0:if tmp>127 then n=1
  320. 3420 z=0:if tmp=0 then z=1
  321. 3430 return
  322.